﻿// owner 蒋家伟

#pragma once

// jsdk
#include "DataSchema_home.h"

namespace jsdk
{
    class UniqueId;
    class IClassFieldDescriptor;
    // 类别描述 : 字段反射管理器，每一个反射的类型都存在一个唯一的实例(类型级别的单例)
    class DATASCHEMA_EXPORT IFieldReflectManager
    {
    public:
        virtual ~IFieldReflectManager() {}
        /// \ brief             注册反射字段
        /// \ in opClassFieldDescriptor     反射字段描述符
        /// \ return                    是否注册成功
        virtual bool registerReflectField(OwnerPtr<IClassFieldDescriptor> opClassFieldDescriptor) = 0;

        /// \ brief  获取当前反射的类别字段个数
        /// \ return 注册成功的字段数量
        virtual uint64_t getFieldCount() const = 0;

        /// \ brief 通过变量名称获取字段描述符
        /// \ in fieldVariableName 变量描述符
        virtual const IClassFieldDescriptor* getFieldDescriptor(const std::wstring& fieldVariableName) const = 0;
        virtual IClassFieldDescriptor* getFieldDescriptor(const std::wstring& fieldVariableName) = 0;

        /// \ brief 获取所属类别的名称
        /// \ return 当前字段反射管理器所属的类别名称
        virtual const std::wstring& getOwnerClassTypeName() const = 0;

        /// \ brief 获取所属类别的uid
        /// \ return 当前字段反射管理器所属的类别uid
        virtual const UniqueId& getOwnerClassTypeUid() const = 0;
    };
}
